From 2c070d38fb417dced66bf8589c4caa66bbd2d9ed Mon Sep 17 00:00:00 2001 From: =?utf8?q?Florian=20M=C3=BCllner?= Date: Mon, 2 Mar 2015 12:14:54 +0100 Subject: [PATCH] system: Switch between alternatives on long-press On systems that support both shutdown and suspend, the latter operation is currently only accessible via pressing the Alt key. As using the keyboard may be inconvenient or simply not possible (e.g. on touch), allow switching between alternatives via long-press as well. https://bugzilla.gnome.org/show_bug.cgi?id=721173 --- js/ui/status/system.js | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/js/ui/status/system.js b/js/ui/status/system.js index 1d666cfb8..92ccf4c48 100644 --- a/js/ui/status/system.js +++ b/js/ui/status/system.js @@ -48,8 +48,14 @@ const AltSwitcher = new Lang.Class({ this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent)); + this._flipped = false; + + this._clickAction = new Clutter.ClickAction(); + this._clickAction.connect('long-press', Lang.bind(this, this._onLongPress)); + this.actor = new St.Bin(); this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); + this.actor.connect('notify::mapped', () => { this._flipped = false; }); }, _sync: function() { @@ -58,14 +64,25 @@ const AltSwitcher = new Lang.Class({ if (this._standard.visible && this._alternate.visible) { let [x, y, mods] = global.get_pointer(); let altPressed = (mods & Clutter.ModifierType.MOD1_MASK) != 0; - childToShow = altPressed ? this._alternate : this._standard; + if (this._flipped) + childToShow = altPressed ? this._standard : this._alternate; + else + childToShow = altPressed ? this._alternate : this._standard; } else if (this._standard.visible) { childToShow = this._standard; } else if (this._alternate.visible) { childToShow = this._alternate; } - if (this.actor.get_child() != childToShow) { + let childShown = this.actor.get_child(); + if (childShown != childToShow) { + if (childShown) { + if (childShown.fake_release) + childShown.fake_release(); + childShown.remove_action(this._clickAction); + } + childToShow.add_action(this._clickAction); + let hasFocus = this.actor.contains(global.stage.get_key_focus()); this.actor.set_child(childToShow); if (hasFocus) @@ -96,6 +113,16 @@ const AltSwitcher = new Lang.Class({ return Clutter.EVENT_PROPAGATE; }, + + _onLongPress: function(action, actor, state) { + if (state == Clutter.LongPressState.QUERY || + state == Clutter.LongPressState.CANCEL) + return true; + + this._flipped = !this._flipped; + this._sync(); + return true; + } }); const Indicator = new Lang.Class({ -- 2.39.5